﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.IO;
using System.Windows;
using System.Windows.Controls;

using Commander.Classes;

namespace Commander.Classes
{
    class ViewsParam
    {
        /// <summary>
        /// метод для заполнения ListView перечнем файлов и папок из заданого пути
        /// </summary>
        /// <param name="lw"></param>
        /// <param name="Patch">путь</param>
        /// <param name="lb2"></param>
        /// <param name="hidden">показивать или нет скритие файли</param>
        /// <returns></returns>
        public static bool InitsList(ListView lw, string Patch,Label lb2,bool hidden)
        {
            //bool _hidden = hidden;
            DirectoryInfo Dir = new DirectoryInfo(Patch);
            int countdir, countfiles;
            long sizefiles;
            countdir = 0;
            countfiles = 0;
            sizefiles = 0;

            try
            {
                DirectoryInfo[] dirs = Dir.GetDirectories();
                FileInfo[] files = Dir.GetFiles();

                lw.Items.Clear();

                if (Patch.Substring(Patch.Length - 2, 2) != @":\")
                {
                    lw.Items.Add(new IOView("..", "", "<Папка>", "", ""));
                }

                foreach (DirectoryInfo di in dirs)
                {
                    if ((di.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
                    {
                        if (hidden)
                        {
                            countdir++;
                            lw.Items.Add(new IOView(di.Name, "", "<Папка>", di.LastWriteTime.ToString(), ""));
                        }
                    }
                    else
                    {
                        countdir++;
                        lw.Items.Add(new IOView(di.Name, "", "<Папка>", di.LastWriteTime.ToString(), ""));
                    }
                }

                foreach (FileInfo fi in files)
                {
                    if ((fi.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
                    {
                        if (hidden)
                        {
                            countfiles++;
                            sizefiles += fi.Length;
                            int a = fi.Name.LastIndexOf('.');
                            if (a == -1)
                            {
                                lw.Items.Add(new IOView(fi.Name, "", Sizes.GetSize(fi.Length), fi.LastWriteTime.ToString(), ""));
                            }
                            else
                            {
                                lw.Items.Add(new IOView(fi.Name.Substring(0, a), fi.Name.Substring(a + 1, fi.Name.Length - a - 1), Sizes.GetSize(fi.Length), fi.LastWriteTime.ToString(), ""));
                            }
                        }
                    }
                    else
                    {
                        countfiles++;
                        sizefiles += fi.Length;
                        int a = fi.Name.LastIndexOf('.');
                        if (a == -1)
                        {
                            lw.Items.Add(new IOView(fi.Name, "", Sizes.GetSize(fi.Length), fi.LastWriteTime.ToString(), ""));
                        }
                        else
                        {
                            lw.Items.Add(new IOView(fi.Name.Substring(0, a), fi.Name.Substring(a + 1, fi.Name.Length - a - 1), Sizes.GetSize(fi.Length), fi.LastWriteTime.ToString(), ""));
                        }
                    }
                }
                lb2.Content = "Кількість папок: " + countdir + "  файлів: " + countfiles + " загальним розміром: " + Sizes.GetSize(sizefiles);
                return true;
            }
            catch (UnauthorizedAccessException a)
            {
                MessageBox.Show(a.ToString());
                return false;
            }
            catch (IOException a)
            {
                MessageBox.Show(a.ToString());
                return false;
            }
        }

        /// <summary>
        /// метод которий возврачает метку тома и занятое и свободное место на диске
        /// </summary>
        /// <param name="patch">путь</param>
        /// <param name="lb">куда виводить</param>
        /// <returns></returns>
        public static bool InitInfo(string patch,Label lb)
        {
            string dick = Path.GetPathRoot(patch);
            string str = "";
            DriveInfo[] allDrivers = DriveInfo.GetDrives();
            foreach (DriveInfo drv in allDrivers)
            {
                if (drv.Name == dick)
                {
                    str += "[ " + drv.VolumeLabel + " ] " + Sizes.GetSize(drv.TotalFreeSpace) + " из " + Sizes.GetSize(drv.TotalSize) + " свободно.";
                    lb.Content = str;
                }
            }
            return true;
        }

        /// <summary>
        /// Добавить итем в список
        /// </summary>
        /// <param name="lw">список</param>
        /// <param name="item">итем шо надо дабавить</param>
        /// <param name="hidden"></param>
        /// <returns></returns>
        public static bool AddItem(ListView lw,string item,bool hidden)
        {
            if (File.Exists(item))
            {
                //MessageBox.Show("file");
                FileInfo fi = new FileInfo(item);
                if ((fi.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
                {
                    if (hidden)
                    {
                        int a = fi.Name.LastIndexOf('.');
                        if (a == -1)
                        {
                            lw.Items.Add(new IOView(fi.Name, "", Sizes.GetSize(fi.Length), fi.LastWriteTime.ToString(), ""));
                        }
                        else
                        {
                            lw.Items.Add(new IOView(fi.Name.Substring(0, a), fi.Name.Substring(a + 1, fi.Name.Length - a - 1), Sizes.GetSize(fi.Length), fi.LastWriteTime.ToString(), ""));
                        }
                    }
                }
                else
                {
                    int a = fi.Name.LastIndexOf('.');
                    if (a == -1)
                    {
                        lw.Items.Add(new IOView(fi.Name, "", Sizes.GetSize(fi.Length), fi.LastWriteTime.ToString(), ""));
                    }
                    else
                    {
                        lw.Items.Add(new IOView(fi.Name.Substring(0, a), fi.Name.Substring(a + 1, fi.Name.Length - a - 1), Sizes.GetSize(fi.Length), fi.LastWriteTime.ToString(), ""));
                    }
                }
            }
            else if(Directory.Exists(item))
            {
                //MessageBox.Show("directory");
                DirectoryInfo di = new DirectoryInfo(item);
                if ((di.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
                {
                    if (hidden)
                    {
                        lw.Items.Add(new IOView(di.Name, "", "<Папка>", di.LastWriteTime.ToString(), ""));
                    }
                }
                else
                {
                    lw.Items.Add(new IOView(di.Name, "", "<Папка>", di.LastWriteTime.ToString(), ""));
                }
            }
            return true;
        }

        /// <summary>
        /// Удалить нужний итем из списка
        /// </summary>
        /// <param name="lw">список</param>
        /// <param name="item">итем шо надо удалить</param>
        /// <returns></returns>
        public static bool DelItem(ListView lw,string item)
        {
            int r = 0;
            var a = lw.Items;
            foreach (IOView s in a)
            {
                MessageBox.Show(s.ToString());
                //if()
                r++;
            }
            
            return true;
        }
    }
}
